
package Controlador;

/**
 *
 * @author Ddj Murillo
 */

import Modelo.ordenCompra;
import Modelo.DetallesOrdenesDeCompra;
import Modelo.DetallesOrdenesDeCompraModelo;
import Modelo.Producto;
import java.sql.SQLException;
import java.util.Iterator;
import java.util.LinkedList;
import javax.swing.JOptionPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

public class ControlOrdenDeCompraDetalles {
    LinkedList lista;
    DetallesOrdenesDeCompraModelo mod= new DetallesOrdenesDeCompraModelo();
    DefaultTableModel tablaModelo;
    private ControlProducto producto=new ControlProducto();

    public ControlOrdenDeCompraDetalles() {
        lista=new LinkedList();
        tablaModelo=new DefaultTableModel();
    }

 /**
   * limpia la tabla
   * @param tabla
   * @return
   */
  public JTable cleanTabla(JTable tabla){
        tablaModelo=(DefaultTableModel) tabla.getModel();
        int x=tablaModelo.getRowCount();
	for(int i=-1;i<(x-1);i++)
		tablaModelo.removeRow(0);

    //    tablaModelo.addRow(new Object[]{});
        return tabla;
  }


  /**
   * Operaciones con la tabla de detalles, en modo de ejecucion carga los items
   * @param jTable
   * @param dato enviado
   * @param fila seleccionada
   * @param columna seleccionada
   * @return jTabla
   */
    public JTable matrizDetalles(JTable tabla) throws SQLException{
        tablaModelo=(DefaultTableModel) tabla.getModel();
        Object[][] matriz=null;
        int x=tablaModelo.getRowCount();
         matriz=new Object[x][10];
        Producto prod=new Producto();

        for(int y=0;y<10;y++)
            for(int i=0;i<x;i++){
                matriz[i][y]=tablaModelo.getValueAt(i,y);
            }


       for(int i=0;i<x;i++){
         // if(matriz[i][0]!=null)
          if(!matriz[i][1].equals(""))
            if(producto.isExist(matriz[i][1].toString())){
               matriz[i][0]=i+1;
               prod=producto.consultaProducto(matriz[i][1].toString());
               matriz[i][2]=prod.getDescripcion();//descripcion
               matriz[i][3]=prod.getExistencia();//existencia

               if(matriz[i][6]==null)
                  matriz[i][6]=prod.getValorVenta();//valor unitario

               if(matriz[i][4]!=null && matriz[i][5]!=null){
                   Double cantFact=Double.parseDouble(matriz[i][5].toString());
                   Double valUnit=Double.parseDouble(matriz[i][6].toString());
                   matriz[i][7]= cantFact * valUnit;//valor bruto

                   matriz[i][8]=prod.getIva();       //IVA

                   Double iva=(Double.parseDouble(matriz[i][8].toString())/100) * (cantFact * valUnit);
                   Double bruto=iva + (cantFact * valUnit);
                   matriz[i][9]=bruto;//valor neto
               }
            }else{
               JOptionPane.showMessageDialog(null,"Codigo de producto No Existe...!");
               matriz[i][1]=null;
            }
        }

        //disminuir la existencia de ese producto
       // prod=producto.consultaProducto(matriz[x][0].toString());



        tabla=cargaTabla(tabla,matriz);
        if(!matriz[x-1][1].equals(""))
           tablaModelo.addRow(new Object[]{"",""});


        return tabla;
    }

    /**
     * metodo para enviar una tabla y reciva una tabla
     * @param tabla
     * @param matriz
     * @return
     */
  private JTable cargaTabla(JTable tabla,Object[][] matriz){
        cleanTabla(tabla);
        tablaModelo=(DefaultTableModel) tabla.getModel();
	int filas=matriz.length;int pos=0;
            while(pos!=filas)
            {
                tablaModelo.addRow
                (
                    new Object[]
                    {
                      matriz[pos][0],
                      matriz[pos][1],
                      matriz[pos][2],
                      matriz[pos][3],
                      matriz[pos][4],
                      matriz[pos][5],
                      matriz[pos][6],
                      matriz[pos][7],
                      matriz[pos][8],
                      matriz[pos][9]}
                );
                pos++;
            }

        return tabla;
    }




    /**
     * calcula la posible cantidad de producto a facturar
     * @param codigo del producto
     * @param cantSolicitada a facturar
     * @return cantidad posible a facturar
     */
    public double cantFacturar(String codigo,Double cantSolicitada) throws SQLException{
        Double cantidad=0.0;
        Producto prod=new Producto();
        prod=producto.consultaProducto(codigo);
        cantidad=prod.getExistencia();
        Double valorFacturado=0.0;

        if(cantSolicitada<0)
            JOptionPane.showMessageDialog(null,"Cantidad Negativa Favor Verificar...!!");
        else{
            /*Si la existencia es mayor que la solicitada dejamos
            igual la cantidad a facturar SINO mostramos lo posible a facturar*/
            if(cantSolicitada<=cantidad){
                 valorFacturado=cantSolicitada;
            }else{
                JOptionPane.showMessageDialog(null,"Solo es posible facturar " + cantidad + " de " + prod.getDescripcion());
                 valorFacturado=cantidad;
            }
        }
        return valorFacturado;
    }


    /** guarda los detalles del pedido
     * @param tabla
     * @param consecutivo pedido
     * @return
     */
  public void registrarDetallesTabla(JTable tabla,String consecutivopedido){
      tablaModelo=(DefaultTableModel) tabla.getModel();
      int row=0;
       	try
	{
            while(!tablaModelo.getValueAt(row,1).equals(""))
            {
               if((String)tablaModelo.getValueAt(row,1)!=null && (Double)tablaModelo.getValueAt(row,4)!=null && (Double)tablaModelo.getValueAt(row,6)!=null){
                   DetallesOrdenesDeCompra DoDc=new DetallesOrdenesDeCompra(//consecutivo pedido
                                                        (Integer)tablaModelo.getValueAt(row,0),//item numero
                                                        (Double)tablaModelo.getValueAt(row,1),//codigo de producto
                                                        (Double)tablaModelo.getValueAt(row,4),//cantidad solicitada
                                                        consecutivopedido,
                                                        (String)tablaModelo.getValueAt(row,6)
                                                        );//valor unitario
                   mod.setNuevoDetallesCompra(DoDc);
               }
               row++;
            }

	}catch(Exception er){
		JOptionPane.showMessageDialog(null, "Error al guardar la lista de Detalles en la base de datos, se presento " +
                        "\n un inconveniente al tratar de Buscar la informacion requerida " +
                        "\n por el sistema." +
                        "\n."+er.toString() , "Error en la Carga de Informacion...",JOptionPane.DEFAULT_OPTION);
	}
    }

  /** consulta los detalles del pedido
     * @param tabla
     * @param consecutivo pedido
     * @return
     */
     public JTable cargaDetallesTabla(JTable tabla,String consulta){
        DetallesOrdenesDeCompra detOrComp=new DetallesOrdenesDeCompra();
        cleanTabla(tabla);
        tablaModelo=(DefaultTableModel) tabla.getModel();
	try
	{
            lista=mod.consultaDetallesTabla(consulta);
            Iterator it=lista.iterator();
            while( it.hasNext() )
            {
                detOrComp=(DetallesOrdenesDeCompra)it.next();
                tablaModelo.addRow
                (
                    new Object[]
                    {
                      detOrComp.getItemNo(),
                      detOrComp.getValorUnitario(),
                      null,
                      null,
                      detOrComp.getCantidadDecimal(),
                      cantFacturar(detOrComp.getProducto_codigo(),detOrComp.getCantidadDecimal()),
                      detOrComp.getValorUnitario()
                    }
                );
            }

            tabla=matrizDetalles(tabla);//le doy los demas valores de los campos siguientes



	}catch(Exception er){
		JOptionPane.showMessageDialog(null, "Error al cargar la lista de Cliente de la base de datos, se presento " +
                        "\n un inconveniente al tratar de Buscar la informacion requerida " +
                        "\n por el sistema." +
                        "\n."+er.toString() , "Error en la Carga de Informacion...",JOptionPane.DEFAULT_OPTION);
	}
        return tabla;
    }

     /**
      * borro los registros existentes, y cargo nuevamente
      * @param tabla
      * @param consecutivopedido
      */
     public void actualizarDetallesTabla(JTable tabla,String consecutivocompra) throws SQLException{
         mod.deleteDetalles(consecutivocompra);
         registrarDetallesTabla(tabla, consecutivocompra);
     }
}
